package com.bookmanagement.service;

import com.bookmanagement.mapper.UserMapper;
import com.bookmanagement.entity.User;
import com.bookmanagement.util.JwtUtil;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * 用户服务类，处理用户相关业务逻辑
 */
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 用户注册
     * @param user 用户信息
     */
    public void registerUser(User user) {
        if (userMapper.findByUsername(user.getUsername()) != null) {
            throw new RuntimeException("用户名已存在");
        }
//        if (user.getUsername().length() < 5 || user.getUsername().length() > 16) {
//            throw new RuntimeException("用户名长度必须为5-16位");
//        }
        if (user.getPassword() == null || user.getPassword().isEmpty()) {
            throw new RuntimeException("密码不能为空");
        }
//        user.setUserType("user");
        user.setBlocked(false);
        user.setPassword(user.getPassword());
        userMapper.insertUser(user);
    }

    /**
     * 用户登录
     * @param username 用户名
     * @param password 密码
     * @return JWT 令牌
     */
    public String login(String username, String password) {
        User user = userMapper.findByUsername(username);
        if (user == null || !user.getPassword().equals(password)) {
            throw new RuntimeException("用户名或密码错误");
        }
        return jwtUtil.generateToken(user.getId(), user.getUsername());
    }

    /**
     * 修改用户密码
     * @param userId 用户ID
     * @param oldPwd 原密码
     * @param newPwd 新密码
     * @param rePwd 确认新密码
     */
    public void updatePassword(Long userId, String oldPwd, String newPwd, String rePwd) {
        User user = userMapper.findById(userId);
        if (!user.getPassword().equals(oldPwd)) {
            throw new RuntimeException("原密码错误");
        }
        if (!newPwd.equals(rePwd)) {
            throw new RuntimeException("新密码与确认密码不匹配");
        }
        userMapper.updatePassword(userId, newPwd);
    }

    /**
     * 创建新用户（管理员或超级用户调用）
     * @param user 用户信息
     * @param creatorUsername 创建者的用户名
     */
    public void createUser(User user, String creatorUsername) {/*它接受参数：一个User类型的对象   user */
//        User creator = userMapper.findByUsername(creatorUsername);
//        if (creator == null || (!creator.getUserType().equals("super") && !creator.getUserType().equals("admin"))) {
//            throw new RuntimeException("只有超级用户或管理员可以创建用户");
//        }
        if (userMapper.findByUsername(user.getUsername()) != null) {
            throw new RuntimeException("用户名已存在");
            /*这行代码调用   userMapper   的   findByUsername   方法，
            传入  user   对象的   username   属性，检查数据库中是否已存在该用户名。*/
        }
        user.setPassword(user.getPassword());
        /*这行代码将   user   对象的密码设置为传入的   user   对象中的密码。
        是为了确保在插入数据库之前密码是正确的。*/
        userMapper.insertUser(user);
        /*这行代码调用   userMapper   的   insertUser   方法，将   user   对象插入到数据库中。*/
    }

    /**
     * 根据用户名查找用户
     * @param username 用户名
     * @return 用户信息
     */
    public User findByUsername(String username) {
        return userMapper.findByUsername(username);
    }

    /**
     * 根据ID查找用户
     * @param id 用户ID
     * @return 用户信息
     */
    public User findById(Long id) {
        return userMapper.findById(id);
    }

    public Map<String, Object> getUsers(int pageNum, int pageSize, String username, String name, String userType) {
        int total = userMapper.countUsers(username, name, userType);
        int totalPage = total % pageSize == 0 ? total / pageSize : total / pageSize + 1;
        if (pageNum > totalPage) {
            pageNum = totalPage;
        }
        return Map.of("total", total, "totalPage", totalPage, "pageNum", pageNum, "pageSize", pageSize, "items",
                userMapper.findUsers(Math.max((pageNum - 1) * pageSize, 0), pageSize, username, name, userType));
    }

    public void updateUser(User user) {
         userMapper.updateUser(user);
    }

    /**
     * 删除用户
     * @param id 用户ID
     */
    public void deleteUser(Long id) {
        User user = userMapper.findById(id);
        if (user == null) {
            throw new RuntimeException("用户不存在，删除失败");
        }
        userMapper.deleteUser(id);
    }

    public List<Map<String, Object>> getUserTypeStats() {
        return userMapper.countUsersByType().stream()
                .map(s -> Map.of(
                        "name", switch (s.get("name").toString()) {
                            case "super", "admin" -> "管理员";
                            case "user" -> "学生";
                            default -> s.get("name").toString();
                        },
                        "value", s.get("value")
                ))
                .toList();
    }
}